package org.xxkk.util;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;

/**
 * @author xxkk
 * @version 1.0.0
 * @title XKJson
 * @description ʕ•ᴥ•ʔ
 * @create 2025/1/11 16:46
 **/
public class XKJson {


    // 将 Java 对象转换为 JSON 字符串
    public static String convertToJson(Object obj) {
        if (obj == null) {
            throw new IllegalArgumentException("对象不能为空");
        }

        StringBuilder json = new StringBuilder();
        json.append("{");

        Field[] fields = obj.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            try {
                String name = fields[i].getName();
                Object value = fields[i].get(obj);
                json.append("\"").append(name).append("\":");

                if (value instanceof String) {
                    json.append("\"").append(value).append("\"");
                } else if (value instanceof Number || value instanceof Boolean) {
                    json.append(value);
                } else if (value instanceof Collection) {
                    json.append(convertCollectionToJson((Collection<?>) value));
                } else if (value instanceof Map) {
                    json.append(convertMapToJson((Map<?, ?>) value));
                } else {
                    json.append(convertToJson(value));
                }

                if (i < fields.length - 1) {
                    json.append(",");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        json.append("}");
        return json.toString();
    }

    // 将集合转换为 JSON 字符串
    private static String convertCollectionToJson(Collection<?> collection) {
        StringBuilder json = new StringBuilder();
        json.append("[");
        int i = 0;
        for (Object item : collection) {
            json.append(convertToJson(item));
            if (i < collection.size() - 1) {
                json.append(",");
            }
            i++;
        }
        json.append("]");
        return json.toString();
    }

    // 将 Map 转换为 JSON 字符串
    private static String convertMapToJson(Map<?, ?> map) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        int i = 0;
        for (Map.Entry<?, ?> entry : map.entrySet()) {
            json.append("\"").append(entry.getKey()).append("\":");
            json.append(convertToJson(entry.getValue()));
            if (i < map.size() - 1) {
                json.append(",");
            }
            i++;
        }
        json.append("}");
        return json.toString();
    }

    // 格式化 JSON 字符串
    public static String formatJson(String jsonString) {
        StringBuilder formattedJson = new StringBuilder();
        int indentLevel = 0;
        boolean inQuotes = false;

        for (char charFromJson : jsonString.toCharArray()) {
            switch (charFromJson) {
                case '"':
                    formattedJson.append(charFromJson);
                    inQuotes = !inQuotes;
                    break;
                case ' ':
                    if (inQuotes) {
                        formattedJson.append(charFromJson);
                    }
                    break;
                case '{':
                case '[':
                    formattedJson.append(charFromJson);
                    if (!inQuotes) {
                        formattedJson.append("\n");
                        indentLevel++;
                        addIndentation(formattedJson, indentLevel);
                    }
                    break;
                case '}':
                case ']':
                    if (!inQuotes) {
                        formattedJson.append("\n");
                        indentLevel--;
                        addIndentation(formattedJson, indentLevel);
                    }
                    formattedJson.append(charFromJson);
                    break;
                case ',':
                    formattedJson.append(charFromJson);
                    if (!inQuotes) {
                        formattedJson.append("\n");
                        addIndentation(formattedJson, indentLevel);
                    }
                    break;
                case ':':
                    formattedJson.append(charFromJson);
                    if (!inQuotes) {
                        formattedJson.append(" ");
                    }
                    break;
                default:
                    formattedJson.append(charFromJson);
                    break;
            }
        }

        return formattedJson.toString();
    }

    // 添加缩进
    private static void addIndentation(StringBuilder sb, int indentLevel) {
        for (int i = 0; i < indentLevel; i++) {
            sb.append("    "); // 增加4个空格的缩进
        }
    }
}
